セキュリティキー「YubiKey」でEC2へのSSHを2段階認証にしてみた
OpenSSHのFIDO U2F対応について
FIDO U2Fはパスワードレスに認証するための規格です。実装したデバイスとしてYubikeyなどがあり、デバイスをUSBポートに挿して触れるだけ認証されます。
2020年2月にリリースされたOpenSSH 8.2ではこのFIDO U2Fを利用したハードウェア認証に対応しました。
本機能を利用すると、通常の公開鍵認証に追加して、FIDO U2F認証を利用した2段階認証を実現できます。仮に秘密鍵が漏洩しても、鍵の生成に利用したデバイスがない限りSSHログインできません。
やってみた
FIDO U2FデバイスのYubiKeyを利用し、Ubuntu Server 20.04のEC2インスタンスに対して2段階認証でSSHしてみます。
動作環境
OpenSSH 8.2以上のサーバー・クライアントとFIDO/U2Fに対応したデバイスが必要です。
今回は、サーバーにはデフォルトでOpenSSH 8.2に対応したUbuntu 20.04を利用し、クライアントにはbrewで最新版をインストールできるMacを利用しました。
また、FIDO/U2F デバイスには、手元にあった Security Key by Yubico USB-A を利用しました。
鍵の生成
FIDO/U2Fの2段階認証向けに新しい公開鍵タイプ
- ecdsa-sk
- ed25519-sk
が追加されています(ともに楕円曲線DSA。skはsecurity keyの略)。ssh-keygen
の鍵生成時に、この鍵タイプを指定し、デバイスを一度タッチします。
$ ssh-keygen -t ecdsa-sk -f ~/.ssh/id_ecdsa_sk Generating public/private ecdsa-sk key pair. You may need to touch your authenticator to authorize key generation. ★ここでデバイスをタッチ★ Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/jsmith/.ssh/id_ecdsa_sk Your public key has been saved in /Users/jsmith/.ssh/id_ecdsa_sk.pub The key fingerprint is: SHA256:... jsmith@BAR The key's randomart image is: +-[ECDSA-SK 256]--+ | .o..oo | |. .oo. .. | |o=.. o. | |BoO + .o | |+X + o. S | |o=o.. ...o | |+E* .o.+o . | |.o = =+. | | o .o oo | +----[SHA256]-----+
- 秘密鍵 :
id_ecdsa_sk
- 公開鍵 :
id_ecdsa_sk.pub
が生成されます。
Ubuntu 20.04のEC2インスタンスを起動
クイックスタート一覧に Ubuntu Server 20.04 LTS が含まれているので、そちらを起動します。
公開鍵をログインサーバーに展開
公開鍵(id_ecdsa_sk.pub
)をログインサーバーの $HOME/.ssh/authorized_keys
に追記します。
ssh-rsa ... [email protected] ... ← 追加
SSH実行
秘密鍵(id_ecdsa_sk
)を指定してSSHします。
"Confirm user presence for key ECDSA-SK SHA256:..." とFIDO/U2F 認証をもとめられるので、デバイスをタッチします。
$ ssh -i $HOME/.ssh/id_ecdsa_sk [email protected] Confirm user presence for key ECDSA-SK SHA256:... ★ここでデバイスをタッチ★ Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-1009-aws x86_64) ... ubuntu@ip-172-31-35-110:~$
無事ログインできました。
対応する SSH ログを確認します。
May 24 10:32:09 ip-172-31-35-110 sshd[1320]: Accepted publickey for ubuntu from 1.2.3.4 port 62739 ssh2: ECDSA-SK SHA256:... May 24 10:32:09 ip-172-31-35-110 sshd[1320]: pam_unix(sshd:session): session opened for user ubuntu by (uid=0) May 24 10:32:09 ip-172-31-35-110 systemd-logind[529]: New session 3 of user ubuntu.
"ssh2: ECDSA-SK SHA256:" から、ECDSA-SK の鍵で認証したことがわかります。
最後に
SSHログインのセキュリティを強化するための手段として、2段階認証は非常に有効です。
OSSを活用した実装として、Google Authenticatorと連携し、ワンタイムパスワードを用いて2段階認証することも可能ですが、構築が少し複雑でした。
今回紹介したFIDO U2Fを利用した2段階認証ではOpenSSHの機能しか利用しないため、構築・管理が非常にシンプルになります。
ただし
- サーバー・クライアントともに、最新の OpenSSH 8.2 以上が必要
- FIDO/U2Fデバイスが必要
という点にはお気をつけください。
Ubuntu 20.04は初期状態からOpenSSH 8.2がインストールされているので、動作検証におすすめです。
それでは。